﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

// Содержит устаревшую реализацию для программного интерфейса модуля АдминистрированиеКластераКлиентСервер.

#Область СлужебныйПрограммныйИнтерфейс

#Область БлокировкаСеансовИЗаданий

// Возвращает текущее состояние блокировки сеансов и регламентных заданий для информационной базы.
//
// Параметры:
//  ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//  ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//
// Возвращаемое значение:
//   см. АдминистрированиеКластераКлиентСервер.СвойстваБлокировкиСеансовИРегламентныхЗаданий
//
Функция БлокировкаСеансовИЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИнформационнаяБаза = ПолучитьИБ(
		СоединениеСРабочимПроцессом,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	Результат = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(
		ИнформационнаяБаза,
		СловарьСвойствБлокировкиСеансовИРегламентныхЗаданий());
	
	Если Результат.ДатаС = АдминистрированиеКластераКлиентСервер.ПустаяДата() Тогда
		Результат.ДатаС = Неопределено;
	КонецЕсли;
	
	Если Результат.ДатаПо = АдминистрированиеКластераКлиентСервер.ПустаяДата() Тогда
		Результат.ДатаПо = Неопределено;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Результат.КодРазрешения) Тогда
		Результат.КодРазрешения = "";
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Результат.Сообщение) Тогда
		Результат.Сообщение = "";
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Результат.ПараметрБлокировки) Тогда
		Результат.ПараметрБлокировки = "";
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Устанавливает новое состояние блокировки сеансов и регламентных заданий для информационной базы.
//
// Параметры:
//  ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//  ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//  СвойстваБлокировкиСеансовИЗаданий - см. АдминистрированиеКластераКлиентСервер.СвойстваБлокировкиСеансовИРегламентныхЗаданий
//
Процедура УстановитьБлокировкуСеансовИЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач СвойстваБлокировкиСеансовИЗаданий) Экспорт
	
	УстанавливаемаяБлокировка = Новый Структура();
	Для Каждого КлючИЗначение Из СвойстваБлокировкиСеансовИЗаданий Цикл
		УстанавливаемаяБлокировка.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
	КонецЦикла;
	
	Если Не ЗначениеЗаполнено(УстанавливаемаяБлокировка.ДатаС) Тогда
		УстанавливаемаяБлокировка.ДатаС = АдминистрированиеКластераКлиентСервер.ПустаяДата();
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(УстанавливаемаяБлокировка.ДатаПо) Тогда
		УстанавливаемаяБлокировка.ДатаПо = АдминистрированиеКластераКлиентСервер.ПустаяДата();
	КонецЕсли;
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИнформационнаяБаза = ПолучитьИБ(
		СоединениеСРабочимПроцессом,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
		ИнформационнаяБаза,
		УстанавливаемаяБлокировка,
		СловарьСвойствБлокировкиСеансовИРегламентныхЗаданий());
	
	СоединениеСРабочимПроцессом.UpdateInfoBase(ИнформационнаяБаза);
	
КонецПроцедуры

// Проверяет корректность параметров администрирования.
//
// Параметры:
//  ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//  ПараметрыАдминистрированияИБ - Структура - описывающая параметры подключения к информационной базе,
//    описание - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера.
//    Параметр может быть опущен в том случае, если аналогичные поля были указаны в структуре, переданной
//    в качестве значения параметра ПараметрыАдминистрированияКластера,
//  ПроверятьПараметрыАдминистрированияКластера - Булево - флаг необходимости проверки параметров администрирования
//                                                кластера,
//  ПроверятьПараметрыАдминистрированияИнформационнойБазы - Булево - флаг необходимости проверки параметров
//                                                          администрирования кластера.
//
Процедура ПроверитьПараметрыАдминистрирования(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено,
	ПроверятьПараметрыАдминистрированияИнформационнойБазы = Истина,
	ПроверятьПараметрыАдминистрированияКластера = Истина) Экспорт
	
	Если ПроверятьПараметрыАдминистрированияКластера ИЛИ ПроверятьПараметрыАдминистрированияИнформационнойБазы Тогда
		
		Попытка
			COMСоединитель = COMСоединитель();
		
			СоединениеСАгентомСервера = СоединениеСАгентомСервера(
				COMСоединитель,
				ПараметрыАдминистрированияКластера.АдресАгентаСервера,
				ПараметрыАдминистрированияКластера.ПортАгентаСервера);
			
			Кластер = ПолучитьКластер(
				СоединениеСАгентомСервера,
				ПараметрыАдминистрированияКластера.ПортКластера,
				ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
				ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
		Исключение
#Если ВебКлиент ИЛИ МобильныйКлиент Тогда
			ВызватьИсключение;
#Иначе
			ВызватьИсключение ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + Символы.ПС
				+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В случае ошибки о несоответствии версии компоненты ""comcntr"" зарегистрируйте ее на компьютере %1
					|для учетной записи ОС Windows, от имени которой выполняется 1С:Предприятие. Например:
					|regsvr32.exe ""%2\comcntr.dll""'"), ИмяКомпьютера(), КаталогПрограммы());
#КонецЕсли
		КонецПопытки;
		
	КонецЕсли;
	
	Если ПроверятьПараметрыАдминистрированияИнформационнойБазы Тогда
		
		СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);
		
		ПолучитьИБ(
			СоединениеСРабочимПроцессом,
			Кластер,
			ПараметрыАдминистрированияИБ.ИмяВКластере,
			ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
			ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область БлокировкаРегламентныхЗаданий

// Возвращает текущее состояние блокировки регламентных заданий для информационной базы.
//
// Параметры:
//  ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//  ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//
// Возвращаемое значение:
//   Булево
//
Функция БлокировкаРегламентныхЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИнформационнаяБаза = ПолучитьИБ(
		СоединениеСРабочимПроцессом,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	Возврат ИнформационнаяБаза.ScheduledJobsDenied;
	
КонецФункции

// Устанавливает новое состояние блокировки регламентных заданий для информационной базы.
//
// Параметры:
//  ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//  ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//  БлокировкаРегламентныхЗаданий - Булево - флаг установки блокировки регламентных заданий информационной базы.
//
Процедура УстановитьБлокировкуРегламентныхЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач БлокировкаРегламентныхЗаданий) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИнформационнаяБаза = ПолучитьИБ(
		СоединениеСРабочимПроцессом,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	ИнформационнаяБаза.ScheduledJobsDenied = БлокировкаРегламентныхЗаданий;
	СоединениеСРабочимПроцессом.UpdateInfoBase(ИнформационнаяБаза);
	
КонецПроцедуры

#КонецОбласти

#Область СеансыИнформационнойБазы

// Возвращает описания сеансов информационной базы.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//   Фильтр - см. АдминистрированиеКластера.ФильтрСеансов, Массив из см. АдминистрированиеКластера.ФильтрСеансов
//
// Возвращаемое значение:
//   Массив из см. АдминистрированиеКластераКлиентСервер.СвойстваСеанса
//
Функция СеансыИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач Фильтр = Неопределено) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ОписаниеИнформационнойБазы = ПолучитьОписаниеИБ(
		СоединениеСАгентомСервера,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере);
	
	Возврат ПолучитьСеансы(СоединениеСАгентомСервера, Кластер, ОписаниеИнформационнойБазы, Фильтр, Истина);
	
КонецФункции

// Удаляет сеансы с информационной базой по фильтру.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//   Фильтр - см. АдминистрированиеКластера.ФильтрСеансов, Массив из см. АдминистрированиеКластера.ФильтрСеансов
//
Процедура УдалитьСеансыИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач Фильтр = Неопределено) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ОписаниеИнформационнойБазы = ПолучитьОписаниеИБ(
		СоединениеСАгентомСервера,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере);
	
	КоличествоПопыток = 3;
	ВсеСеансыУдалены = Ложь;
	
	Для ТекущаяПопытка = 0 По КоличествоПопыток Цикл
		
		Сеансы = ПолучитьСеансы(СоединениеСАгентомСервера, Кластер, ОписаниеИнформационнойБазы, Фильтр, Ложь);
		
		Если Сеансы.Количество() = 0 Тогда
			
			ВсеСеансыУдалены = Истина;
			Прервать;
			
		ИначеЕсли ТекущаяПопытка = КоличествоПопыток Тогда
			
			Прервать;
			
		КонецЕсли;
		
		Для каждого Сеанс Из Сеансы Цикл
			
			Попытка
				
				СоединениеСАгентомСервера.TerminateSession(Кластер, Сеанс);
				
			Исключение
				
				// Сеанс мог завершиться к моменту вызова TerminateSession.
				Продолжить;
				
			КонецПопытки;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Если НЕ ВсеСеансыУдалены Тогда
	
		ВызватьИсключение НСтр("ru = 'Не удалось удалить сеансы.'");
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СоединенияСИнформационнойБазой

// Возвращает описания соединений с информационной базой.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//   Фильтр - см. АдминистрированиеКластера.ФильтрСоединений, Массив из см. АдминистрированиеКластера.ФильтрСоединений
//
// Возвращаемое значение:
//   Массив из см. АдминистрированиеКластераКлиентСервер.СвойстваСоединения
//
Функция СоединенияСИнформационнойБазой(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач Фильтр = Неопределено) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	Возврат ПолучитьСоединения(
		COMСоединитель,
		СоединениеСАгентомСервера,
		Кластер,
		ПараметрыАдминистрированияИБ,
		Фильтр,
		Истина);
	
КонецФункции

// Разрывает соединения с информационной базой по фильтру.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//   Фильтр - см. АдминистрированиеКластера.ФильтрСоединений, Массив из см. АдминистрированиеКластера.ФильтрСоединений
//
Процедура РазорватьСоединенияСИнформационнойБазой(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач Фильтр = Неопределено) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
		
	Значение = Новый Массив;
	Значение.Добавить("1CV8");               // идентификатор приложения 1С:Предприятие в режиме запуска "Толстый клиент".
	Значение.Добавить("1CV8C");              // идентификатор приложения 1С:Предприятие в режиме запуска "Тонкий клиент".
	Значение.Добавить("WebClient");          // идентификатор приложения 1С:Предприятие в режиме запуска "Веб-клиент".
	Значение.Добавить("Designer");           // идентификатор приложения Конфигуратор.
	Значение.Добавить("COMConnection");      // идентификатор сессии внешнего соединения 1С:Предприятия через COM.
	Значение.Добавить("WSConnection");       // идентификатор сессии Web-сервиса.
	Значение.Добавить("BackgroundJob");      // идентификатор сессии обработки заданий.
	Значение.Добавить("WebServerExtension"); // идентификатор расширения Web-сервера.

	АдминистрированиеКластераКлиентСервер.ДобавитьУсловиеФильтра(Фильтр, "ИдентификаторКлиентскогоПриложения", ВидСравнения.ВСписке, Значение);
		
	КоличествоПопыток = 3;
	ВсеСоединенияРазорваны = Ложь;
	
	Для ТекущаяПопытка = 0 По КоличествоПопыток Цикл
		
		Соединения = ПолучитьСоединения(
			COMСоединитель,
			СоединениеСАгентомСервера,
			Кластер,
			ПараметрыАдминистрированияИБ,
			Фильтр,
			Ложь);
	
		Если Соединения.Количество() = 0 Тогда
			
			ВсеСоединенияРазорваны = Истина;
			Прервать;
			
		ИначеЕсли ТекущаяПопытка = КоличествоПопыток Тогда
			
			Прервать;
			
		КонецЕсли;
	
		Для каждого Соединение Из Соединения Цикл
			
			Попытка
				
				Соединение.СоединениеСРабочимПроцессом.Disconnect(Соединение.Соединение);
				
			Исключение
				
				// Соединение могло уже завершиться к моменту вызова Disconnect.
				Продолжить;
				
			КонецПопытки;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Если НЕ ВсеСоединенияРазорваны Тогда
	
		ВызватьИсключение НСтр("ru = 'Не удалось разорвать соединения.'");
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ПрофилиБезопасности

// Возвращает имя профиля безопасности, назначенного для информационной базы.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//
// Возвращаемое значение:
//   Строка - имя профиля безопасности, назначенного для информационной базы. Если
//            для информационной базы не назначен профиль безопасности - возвращается пустая строка.
//
Функция ПрофильБезопасностиИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИнформационнаяБаза = ПолучитьИБ(
		СоединениеСРабочимПроцессом,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	Если ЗначениеЗаполнено(ИнформационнаяБаза.SecurityProfileName) Тогда
		Результат = ИнформационнаяБаза.SecurityProfileName;
	Иначе
		Результат = "";
	КонецЕсли;
	
	ИнформационнаяБаза = Неопределено;
	СоединениеСРабочимПроцессом = Неопределено;
	Кластер = Неопределено;
	СоединениеСАгентомСервера = Неопределено;
	COMСоединитель = Неопределено;
	
	Возврат Результат;
	
КонецФункции

// Возвращает имя профиля безопасности, назначенного для информационной базы в качестве профиля безопасности
//  безопасного режима.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//
// Возвращаемое значение:
//   Строка - имя профиля безопасности, назначенного для информационной базы в качестве профиля
//            безопасности безопасного режима. Если для информационной базы не назначен профиль безопасности - возвращается
//            пустая строка.
//
Функция ПрофильБезопасностиБезопасногоРежимаИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИнформационнаяБаза = ПолучитьИБ(
		СоединениеСРабочимПроцессом,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	Если ЗначениеЗаполнено(ИнформационнаяБаза.SafeModeSecurityProfileName) Тогда
		Результат = ИнформационнаяБаза.SafeModeSecurityProfileName;
	Иначе
		Результат = "";
	КонецЕсли;
	
	ИнформационнаяБаза = Неопределено;
	СоединениеСРабочимПроцессом = Неопределено;
	Кластер = Неопределено;
	СоединениеСАгентомСервера = Неопределено;
	COMСоединитель = Неопределено;
	
	Возврат Результат;
	
КонецФункции

// Назначает для информационной базы использование профиля безопасности.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//   ИмяПрофиля - Строка - имя профиля безопасности. Если передана пустая строка - для информационной базы будет
//                отключено использование профиля безопасности.
//
Процедура УстановитьПрофильБезопасностиИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач ИмяПрофиля = "") Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИнформационнаяБаза = ПолучитьИБ(
		СоединениеСРабочимПроцессом,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	ИнформационнаяБаза.SecurityProfileName = ИмяПрофиля;
	
	СоединениеСРабочимПроцессом.UpdateInfoBase(ИнформационнаяБаза);
	
	ИнформационнаяБаза = Неопределено;
	СоединениеСРабочимПроцессом = Неопределено;
	Кластер = Неопределено;
	СоединениеСАгентомСервера = Неопределено;
	COMСоединитель = Неопределено
	
КонецПроцедуры

// Назначает для информационной базы использование профиля безопасности безопасного режима.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//   ИмяПрофиля - Строка - имя профиля безопасности. Если передана пустая строка - для информационной базы будет
//                отключено использование профиля безопасности безопасного режима.
//
Процедура УстановитьПрофильБезопасностиБезопасногоРежимаИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач ИмяПрофиля = "") Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИнформационнаяБаза = ПолучитьИБ(
		СоединениеСРабочимПроцессом,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	ИнформационнаяБаза.SafeModeSecurityProfileName = ИмяПрофиля;
	
	СоединениеСРабочимПроцессом.UpdateInfoBase(ИнформационнаяБаза);
	
	ИнформационнаяБаза = Неопределено;
	СоединениеСРабочимПроцессом = Неопределено;
	Кластер = Неопределено;
	СоединениеСАгентомСервера = Неопределено;
	COMСоединитель = Неопределено
	
КонецПроцедуры

// Проверяет существование в кластере серверов профиля безопасности.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   ИмяПрофиля - Строка - имя профиля безопасности, существование которого проверяется.
//
Функция ПрофильБезопасностиСуществует(Знач ПараметрыАдминистрированияКластера, Знач ИмяПрофиля) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	Для Каждого ПрофильБезопасности Из СоединениеСАгентомСервера.GetSecurityProfiles(Кластер) Цикл
		
		Если ПрофильБезопасности.Name = ИмяПрофиля Тогда
			Возврат Истина;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

// Возвращает свойства профиля безопасности.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   ИмяПрофиля - Строка - имя профиля безопасности.
//
// Возвращаемое значение:
//   см. АдминистрированиеКластераКлиентСервер.СвойстваПрофиляБезопасности
//
Функция ПрофильБезопасности(Знач ПараметрыАдминистрированияКластера, Знач ИмяПрофиля) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ПрофильБезопасности = ПолучитьПрофильБезопасности(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	
	Результат = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(
		ПрофильБезопасности,
		СловарьСвойствПрофиляБезопасности());
	
	// Виртуальный каталоги
	Результат.Вставить("ВиртуальныеКаталоги",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьВиртуальныеКаталоги(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствВиртуальногоКаталога()));
	
	// Разрешенные COM-классы
	Результат.Вставить("COMКлассы",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьCOMКлассы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствCOMКласса()));
	
	// Внешние компоненты
	Результат.Вставить("ВнешниеКомпоненты",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьВнешниеКомпоненты(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствВнешнейКомпоненты()));
	
	// Внешние модули
	Результат.Вставить("ВнешниеМодули",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьВнешниеМодули(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствВнешнегоМодуля()));
	
	// Приложения ОС
	Результат.Вставить("ПриложенияОС",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьПриложенияОС(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствПриложенияОС()));
	
	// Интернет-ресурсы
	Результат.Вставить("ИнтернетРесурсы",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьИнтернетРесурсы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствИнтернетРесурса()));
	
	Возврат Результат;
	
КонецФункции

// Создает профиль безопасности по переданному описанию.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   СвойстваПрофиляБезопасности - см. АдминистрированиеКластераКлиентСервер.СвойстваПрофиляБезопасности
//
Процедура СоздатьПрофильБезопасности(Знач ПараметрыАдминистрированияКластера, Знач СвойстваПрофиляБезопасности) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ПрофильБезопасности = СоединениеСАгентомСервера.CreateSecurityProfile();
	ПрименитьИзмененияСвойствПрофиляБезопасности(СоединениеСАгентомСервера, Кластер, ПрофильБезопасности, СвойстваПрофиляБезопасности);
	
КонецПроцедуры

// Устанавливает свойства для существующего профиля безопасности по переданному описанию.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//   СвойстваПрофиляБезопасности - см. АдминистрированиеКластераКлиентСервер.СвойстваПрофиляБезопасности
//
Процедура УстановитьСвойстваПрофиляБезопасности(Знач ПараметрыАдминистрированияКластера, Знач СвойстваПрофиляБезопасности)  Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ПрофильБезопасности = ПолучитьПрофильБезопасности(
		СоединениеСАгентомСервера,
		Кластер,
		СвойстваПрофиляБезопасности.Имя);
	
	ПрименитьИзмененияСвойствПрофиляБезопасности(СоединениеСАгентомСервера, Кластер, ПрофильБезопасности, СвойстваПрофиляБезопасности);
	
КонецПроцедуры

// Удаляет профиль безопасности.
//
// Параметры:
//  ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//  ИмяПрофиля - Строка - имя профиля безопасности.
//
Процедура УдалитьПрофильБезопасности(Знач ПараметрыАдминистрированияКластера, Знач ИмяПрофиля) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ПолучитьПрофильБезопасности(
		СоединениеСАгентомСервера,
		Кластер,
		ИмяПрофиля);
	
	СоединениеСАгентомСервера.UnregSecurityProfile(Кластер, ИмяПрофиля);
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция COMСоединитель()
	
	// АПК:547-выкл код сохранен для обратной совместимости, используется в устаревшем программном интерфейсе.
	
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 
	Если БезопасныйРежим() <> Ложь Тогда
		ВызватьИсключение НСтр("ru = 'Внимание! Администрирование кластера невозможно в безопасном режиме'");
	КонецЕсли;
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		ВызватьИсключение НСтр("ru = 'Внимание! В модели сервиса недопустимо выполнение прикладной информационной базой функций администрирования кластера'");
	КонецЕсли;
	
	Возврат Новый COMОбъект(ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя());
#ИначеЕсли МобильныйКлиент Тогда
	ВызватьИсключение НСтр("ru = 'Внимание! Администрирование кластера невозможно в мобильном клиенте'");
#Иначе
	Возврат Новый COMОбъект(ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя());
#КонецЕсли
	
	// АПК:547-вкл
	
КонецФункции

Функция СоединениеСАгентомСервера(COMСоединитель, Знач АдресАгентаСервера, Знач ПортАгентаСервера)
	
	СтрокаСоединенияСАгентомСервера = "tcp://" + АдресАгентаСервера + ":" + Формат(ПортАгентаСервера, "ЧГ=0");
	СоединениеСАгентомСервера = COMСоединитель.ConnectAgent(СтрокаСоединенияСАгентомСервера);
	Возврат СоединениеСАгентомСервера;
	
КонецФункции

Функция ПолучитьКластер(СоединениеСАгентомСервера, Знач ПортКластера, Знач ИмяАдминистратораКластера, Знач ПарольАдминистратораКластера)
	
	Для Каждого Кластер Из СоединениеСАгентомСервера.GetClusters() Цикл
		
		Если Кластер.MainPort = ПортКластера Тогда
			
			СоединениеСАгентомСервера.Authenticate(Кластер, ИмяАдминистратораКластера, ПарольАдминистратораКластера);
			
			Возврат Кластер;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'На рабочем сервере %1 не существует кластер %2'"),
		СоединениеСАгентомСервера.ConnectionString,
		ПортКластера);
	
КонецФункции

Функция СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер)
	
	Для Каждого РабочийПроцесс Из СоединениеСАгентомСервера.GetWorkingProcesses(Кластер) Цикл
		Если РабочийПроцесс.Running И РабочийПроцесс.IsEnable  Тогда
			СтрокаСоединенияСРабочимПроцессом = РабочийПроцесс.HostName + ":" + Формат(РабочийПроцесс.MainPort, "ЧГ=");
			Возврат COMСоединитель.ConnectWorkingProcess(СтрокаСоединенияСРабочимПроцессом);
		КонецЕсли;
	КонецЦикла;
	
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не существует активных рабочих процессов.'"),
		Кластер.HostName,
		Формат(Кластер.MainPort, "ЧГ=0"));
	
КонецФункции

Функция ПолучитьОписаниеИБ(СоединениеСАгентомСервера, Кластер, Знач ИмяВКластере)
	
	Для Каждого ОписаниеИнформационнойБазы Из СоединениеСАгентомСервера.GetInfoBases(Кластер) Цикл
		
		Если НРег(ОписаниеИнформационнойБазы.Name) = НРег(ИмяВКластере) Тогда
			
			Возврат ОписаниеИнформационнойБазы;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не существует информационная база ""%3""'"),
		Кластер.HostName,
		Формат(Кластер.MainPort, "ЧГ=0"),
		ИмяВКластере);
	
КонецФункции

Функция ПолучитьИБ(СоединениеСРабочимПроцессом, Кластер, Знач ИмяВКластере, Знач ИмяАдминистратораИБ, Знач ПарольАдминистратораИБ)
	
	СоединениеСРабочимПроцессом.AddAuthentication(ИмяАдминистратораИБ, ПарольАдминистратораИБ);
	
	Для Каждого ИнформационнаяБаза Из СоединениеСРабочимПроцессом.GetInfoBases() Цикл
		
		Если НРег(ИнформационнаяБаза.Name) = НРег(ИмяВКластере) Тогда
			
			Если Не ЗначениеЗаполнено(ИнформационнаяБаза.DBMS) Тогда
				
				ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Неправильные имя и пароль администратора информационной базы %1 в кластере серверов %2:%3 (имя: ""%4"").'"),
					ИмяВКластере,
					Кластер.HostName, 
					Кластер.MainPort,
					ИмяАдминистратораИБ);
				
			КонецЕсли;
			
			Возврат ИнформационнаяБаза;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не существует информационная база ""%3""'"),
		Кластер.HostName,
		Формат(Кластер.MainPort, "ЧГ=0"),
		ИмяВКластере);
	
КонецФункции

Функция ПолучитьСеансы(СоединениеСАгентомСервера, Кластер, ИнформационнаяБаза, Знач Фильтр = Неопределено, Знач Описания = Ложь)
	
	Сеансы = Новый Массив;
	
	Словарь = СловарьСвойствСеансов();
	
	Для Каждого Сеанс Из СоединениеСАгентомСервера.GetInfoBaseSessions(Кластер, ИнформационнаяБаза) Цикл
		
		ОписаниеСеанса = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(Сеанс, Словарь);
		
		Если АдминистрированиеКластераКлиентСервер.ПроверитьУсловияФильтра(ОписаниеСеанса, Фильтр) Тогда
			
			Если Описания Тогда
				Сеансы.Добавить(ОписаниеСеанса);
			Иначе
				Сеансы.Добавить(Сеанс);
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Сеансы;
	
КонецФункции

Функция ПолучитьСоединения(COMСоединитель, СоединениеСАгентомСервера, Кластер, ПараметрыАдминистрированияИБ, Знач Фильтр = Неопределено, Знач Описания = Ложь)
	
	ИмяВКластере = ПараметрыАдминистрированияИБ.ИмяВКластере;
	ИмяАдминистратораИБ = ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы;
	ПарольАдминистратораИБ = ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы;
	
	Соединения = Новый Массив();
	Словарь = СловарьСвойствСоединений();
	
	// Рабочие процессы, зарегистрированные в кластере.
	Для каждого РабочийПроцесс Из СоединениеСАгентомСервера.GetWorkingProcesses(Кластер) Цикл
		
		// Административное соединение с рабочим процессом.
		СтрокаСоединенияСРабочимПроцессом = РабочийПроцесс.HostName + ":" + Формат(РабочийПроцесс.MainPort, "ЧГ=");
		СоединениеСРабочимПроцессом = COMСоединитель.ConnectWorkingProcess(СтрокаСоединенияСРабочимПроцессом);
		
		// Получение информационных баз (аутентификация не требуется).
		Для каждого ИнформационнаяБаза Из СоединениеСРабочимПроцессом.GetInfoBases() Цикл
			
			// Это требуемая информационная база.
			Если НРег(ИнформационнаяБаза.Name) = НРег(ИмяВКластере) Тогда
				
				// Для получение соединений с информационной базой требуется аутентификация.
				СоединениеСРабочимПроцессом.AddAuthentication(ИмяАдминистратораИБ, ПарольАдминистратораИБ);
				
				// Получение соединений с информационной базой.
				Для каждого Соединение Из СоединениеСРабочимПроцессом.GetInfoBaseConnections(ИнформационнаяБаза) Цикл
					
					ОписаниеСоединения = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(Соединение, Словарь);
					
					// Проверка соединения на соответствие требуемым фильтрам.
					Если АдминистрированиеКластераКлиентСервер.ПроверитьУсловияФильтра(ОписаниеСоединения, Фильтр) Тогда
						
						Если Описания Тогда
							
							Соединения.Добавить(ОписаниеСоединения);
							
						Иначе
							
							Соединения.Добавить(Новый Структура("СоединениеСРабочимПроцессом, Соединение", СоединениеСРабочимПроцессом, Соединение));
							
						КонецЕсли;
						
					КонецЕсли;
				
				КонецЦикла;
				
			КонецЕсли;
			
		КонецЦикла;
	
	КонецЦикла;
	
	Возврат Соединения;
	
КонецФункции

Функция ПолучитьПрофильБезопасности(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	Для Каждого ПрофильБезопасности Из СоединениеСАгентомСервера.GetSecurityProfiles(Кластер) Цикл
		
		Если НРег(ПрофильБезопасности.Name) = НРег(ИмяПрофиля) Тогда
			Возврат ПрофильБезопасности;
		КонецЕсли;
		
	КонецЦикла;
	
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не существует профиль безопасности ""%3""'"),
		Кластер.HostName,
		Формат(Кластер.MainPort, "ЧГ=0"),
		ИмяПрофиля);
	
КонецФункции

Функция ПолучитьВиртуальныеКаталоги(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	ВиртуальныеКаталоги = Новый Массив();
	
	Для Каждого ВиртуальныйКаталог Из СоединениеСАгентомСервера.GetSecurityProfileVirtualDirectories(Кластер, ИмяПрофиля) Цикл
		
		ВиртуальныеКаталоги.Добавить(ВиртуальныйКаталог);
		
	КонецЦикла;
	
	Возврат ВиртуальныеКаталоги;
	
КонецФункции

Функция ПолучитьCOMКлассы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	COMКлассы = Новый Массив();
	
	Для Каждого COMКласс Из СоединениеСАгентомСервера.GetSecurityProfileCOMClasses(Кластер, ИмяПрофиля) Цикл
		
		COMКлассы.Добавить(COMКласс);
		
	КонецЦикла;
	
	Возврат COMКлассы;
	
КонецФункции

Функция ПолучитьВнешниеКомпоненты(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	ВнешниеКомпоненты = Новый Массив();
	
	Для Каждого ВнешняяКомпонента Из СоединениеСАгентомСервера.GetSecurityProfileAddIns(Кластер, ИмяПрофиля) Цикл
		
		ВнешниеКомпоненты.Добавить(ВнешняяКомпонента);
		
	КонецЦикла;
	
	Возврат ВнешниеКомпоненты;
	
КонецФункции

Функция ПолучитьВнешниеМодули(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	ВнешниеМодули = Новый Массив();
	
	Для Каждого ВнешнийМодуль Из СоединениеСАгентомСервера.GetSecurityProfileUnSafeExternalModules(Кластер, ИмяПрофиля) Цикл
		
		ВнешниеМодули.Добавить(ВнешнийМодуль);
		
	КонецЦикла;
	
	Возврат ВнешниеМодули;
	
КонецФункции

Функция ПолучитьПриложенияОС(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	ПриложенияОС = Новый Массив();
	
	Для Каждого ПриложениеОС Из СоединениеСАгентомСервера.GetSecurityProfileApplications(Кластер, ИмяПрофиля) Цикл
		
		ПриложенияОС.Добавить(ПриложениеОС);
		
	КонецЦикла;
	
	Возврат ПриложенияОС;
	
КонецФункции

Функция ПолучитьИнтернетРесурсы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	ИнтернетРесурсы = Новый Массив();
	
	Для Каждого ИнтернетРесурс Из СоединениеСАгентомСервера.GetSecurityProfileInternetResources(Кластер, ИмяПрофиля) Цикл
		
		ИнтернетРесурсы.Добавить(ИнтернетРесурс);
		
	КонецЦикла;
	
	Возврат ИнтернетРесурсы;
	
КонецФункции

Процедура ПрименитьИзмененияСвойствПрофиляБезопасности(СоединениеСАгентомСервера, Кластер, ПрофильБезопасности, СвойстваПрофиляБезопасности)
	
	ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
		ПрофильБезопасности,
		СвойстваПрофиляБезопасности,
		СловарьСвойствПрофиляБезопасности());
	
	ИмяПрофиля = СвойстваПрофиляБезопасности.Имя;
	
	СоединениеСАгентомСервера.RegSecurityProfile(Кластер, ПрофильБезопасности);
	
	// Виртуальный каталоги
	УдаляемыеВиртуальныеКаталоги = ПолучитьВиртуальныеКаталоги(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемыйВиртуальныйКаталог Из УдаляемыеВиртуальныеКаталоги Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileVirtualDirectory(
			Кластер,
			ИмяПрофиля,
			УдаляемыйВиртуальныйКаталог.Alias);
	КонецЦикла;
	СоздаваемыеВиртуальныеКаталоги = СвойстваПрофиляБезопасности.ВиртуальныеКаталоги;
	Для Каждого СоздаваемыйВиртуальныйКаталог Из СоздаваемыеВиртуальныеКаталоги Цикл
		ВиртуальныйКаталог = СоединениеСАгентомСервера.CreateSecurityProfileVirtualDirectory();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			ВиртуальныйКаталог,
			СоздаваемыйВиртуальныйКаталог,
			СловарьСвойствВиртуальногоКаталога());
		СоединениеСАгентомСервера.RegSecurityProfileVirtualDirectory(Кластер, ИмяПрофиля, ВиртуальныйКаталог);
	КонецЦикла;
	
	// Разрешенные COM-классы
	УдаляемыеCOMКлассы = ПолучитьCOMКлассы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемыйCOMКласс Из УдаляемыеCOMКлассы Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileCOMClass(
			Кластер,
			ИмяПрофиля,
			УдаляемыйCOMКласс.Name);
	КонецЦикла;
	СоздаваемыеCOMКлассы = СвойстваПрофиляБезопасности.COMКлассы;
	Для Каждого СоздаваемыйCOMКласс Из СоздаваемыеCOMКлассы Цикл
		COMКласс = СоединениеСАгентомСервера.CreateSecurityProfileCOMClass();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			COMКласс,
			СоздаваемыйCOMКласс,
			СловарьСвойствCOMКласса());
		СоединениеСАгентомСервера.RegSecurityProfileCOMClass(Кластер, ИмяПрофиля, COMКласс);
	КонецЦикла;
	
	// Внешние компоненты
	УдаляемыеВнешниеКомпоненты = ПолучитьВнешниеКомпоненты(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемыйВнешнийКомпонент Из УдаляемыеВнешниеКомпоненты Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileAddIn(
			Кластер,
			ИмяПрофиля,
			УдаляемыйВнешнийКомпонент.Name);
	КонецЦикла;
	СоздаваемыеВнешниеКомпоненты = СвойстваПрофиляБезопасности.ВнешниеКомпоненты;
	Для Каждого СоздаваемыйВнешнийКомпонент Из СоздаваемыеВнешниеКомпоненты Цикл
		ВнешнийКомпонент = СоединениеСАгентомСервера.CreateSecurityProfileAddIn();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			ВнешнийКомпонент,
			СоздаваемыйВнешнийКомпонент,
			СловарьСвойствВнешнейКомпоненты());
		СоединениеСАгентомСервера.RegSecurityProfileAddIn(Кластер, ИмяПрофиля, ВнешнийКомпонент);
	КонецЦикла;
	
	// Внешние модули
	УдаляемыеВнешниеМодули = ПолучитьВнешниеМодули(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемыйВнешнийМодуль Из УдаляемыеВнешниеМодули Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileUnSafeExternalModule(
			Кластер,
			ИмяПрофиля,
			УдаляемыйВнешнийМодуль.Name);
	КонецЦикла;
	СоздаваемыеВнешниеМодули = СвойстваПрофиляБезопасности.ВнешниеМодули;
	Для Каждого СоздаваемыйВнешнийМодуль Из СоздаваемыеВнешниеМодули Цикл
		ВнешнийМодуль = СоединениеСАгентомСервера.CreateSecurityProfileUnSafeExternalModule();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			ВнешнийМодуль,
			СоздаваемыйВнешнийМодуль,
			СловарьСвойствВнешнегоМодуля());
		СоединениеСАгентомСервера.RegSecurityProfileUnSafeExternalModule(Кластер, ИмяПрофиля, ВнешнийМодуль);
	КонецЦикла;
	
	// Приложения ОС
	УдаляемыеПриложенияОС = ПолучитьПриложенияОС(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемоеПриложениеОС Из УдаляемыеПриложенияОС Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileApplication(
			Кластер,
			ИмяПрофиля,
			УдаляемоеПриложениеОС.Name);
	КонецЦикла;
	СоздаваемыеПриложенияОС = СвойстваПрофиляБезопасности.ПриложенияОС;
	Для Каждого СоздаваемоеПриложениеОС Из СоздаваемыеПриложенияОС Цикл
		ПриложениеОС = СоединениеСАгентомСервера.CreateSecurityProfileApplication();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			ПриложениеОС,
			СоздаваемоеПриложениеОС,
			СловарьСвойствПриложенияОС());
		СоединениеСАгентомСервера.RegSecurityProfileApplication(Кластер, ИмяПрофиля, ПриложениеОС);
	КонецЦикла;
	
	// Интернет-ресурсы
	УдаляемыеИнтернетРесурсы = ПолучитьИнтернетРесурсы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемыйИнтернетРесурс Из УдаляемыеИнтернетРесурсы Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileInternetResource(
			Кластер,
			ИмяПрофиля,
			УдаляемыйИнтернетРесурс.Name);
	КонецЦикла;
	СоздаваемыеИнтернетРесурсы = СвойстваПрофиляБезопасности.ИнтернетРесурсы;
	Для Каждого СоздаваемыйИнтернетРесурс Из СоздаваемыеИнтернетРесурсы Цикл
		ИнтернетРесурс = СоединениеСАгентомСервера.CreateSecurityProfileInternetResource();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			ИнтернетРесурс,
			СоздаваемыйИнтернетРесурс,
			СловарьСвойствИнтернетРесурса());
		СоединениеСАгентомСервера.RegSecurityProfileInternetResource(Кластер, ИмяПрофиля, ИнтернетРесурс);
	КонецЦикла;
	
КонецПроцедуры

Функция ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(Знач Объект, Знач Словарь)
	
	Описание = Новый Структура();
	Для Каждого ФрагментСловаря Из Словарь Цикл
		Если ЗначениеЗаполнено(Объект[ФрагментСловаря.Значение]) Тогда
			Описание.Вставить(ФрагментСловаря.Ключ, Объект[ФрагментСловаря.Значение]);
		Иначе
			Описание.Вставить(ФрагментСловаря.Ключ, Неопределено);
		КонецЕсли;
	КонецЦикла;
	
	Возврат Описание;
	
КонецФункции

Функция ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(Знач Объекты, Знач Словарь)
	
	Описания = Новый Массив();
	
	Для Каждого Объект Из Объекты Цикл
		Описания.Добавить(ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(Объект, Словарь));
	КонецЦикла;
	
	Возврат Описания;
	
КонецФункции

Процедура ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(Объект, Знач Описание, Знач Словарь)
	
	Для Каждого ФрагментСловаря Из Словарь Цикл
		
		ИмяСвойства = ФрагментСловаря.Значение;
		ЗначениеСвойства = Описание[ФрагментСловаря.Ключ];
		
		Объект[ИмяСвойства] = ЗначениеСвойства;
		
	КонецЦикла;
	
КонецПроцедуры

Функция СловарьСвойствБлокировкиСеансовИРегламентныхЗаданий()
	
	Результат = Новый Структура();
	
	Результат.Вставить("БлокировкаСеансов", "SessionsDenied");
	Результат.Вставить("ДатаС", "DeniedFrom");
	Результат.Вставить("ДатаПо", "DeniedTo");
	Результат.Вставить("Сообщение", "DeniedMessage");
	Результат.Вставить("КодРазрешения", "PermissionCode");
	Результат.Вставить("ПараметрБлокировки", "DeniedParameter");
	Результат.Вставить("БлокировкаРегламентныхЗаданий", "ScheduledJobsDenied");
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствСеансов()
	
	Результат = Новый Структура();
	
	Результат.Вставить("Номер", "SessionID");
	Результат.Вставить("ИмяПользователя", "UserName");
	Результат.Вставить("ИмяКлиентскогоКомпьютера", "Host");
	Результат.Вставить("ИдентификаторКлиентскогоПриложения", "AppID");
	Результат.Вставить("ИдентификаторЯзыка", "Locale");
	Результат.Вставить("МоментСозданияСеанса", "StartedAt");
	Результат.Вставить("МоментПоследнейАктивностиСеанса", "LastActiveAt");
	Результат.Вставить("БлокировкаСУБД", "blockedByDBMS");
	Результат.Вставить("Блокировка", "blockedByLS");
	Результат.Вставить("Передано", "bytesAll");
	Результат.Вставить("ПереданоЗа5Минут", "bytesLast5Min");
	Результат.Вставить("СерверныхВызовов", "callsAll");
	Результат.Вставить("СерверныхВызововЗа5Минут", "callsLast5Min");
	Результат.Вставить("ДлительностьСерверныхВызовов", "durationAll");
	Результат.Вставить("ДлительностьТекущегоСерверногоВызова", "durationCurrent");
	Результат.Вставить("ДлительностьСерверныхВызововЗа5Минут", "durationLast5Min");
	Результат.Вставить("ПереданоСУБД", "dbmsBytesAll");
	Результат.Вставить("ПереданоСУБДЗа5Минут", "dbmsBytesLast5Min");
	Результат.Вставить("ДлительностьВызововСУБД", "durationAllDBMS");
	Результат.Вставить("ДлительностьТекущегоВызоваСУБД", "durationCurrentDBMS");
	Результат.Вставить("ДлительностьВызововСУБДЗа5Минут", "durationLast5MinDBMS");
	Результат.Вставить("СоединениеСУБД", "dbProcInfo");
	Результат.Вставить("ВремяСоединенияСУБД", "dbProcTook");
	Результат.Вставить("МоментЗахватаСоединенияСУБД", "dbProcTookAt");
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствСоединений()
	
	Результат = Новый Структура();
	
	Результат.Вставить("Номер", "ConnID");
	Результат.Вставить("ИмяПользователя", "UserName");
	Результат.Вставить("ИмяКлиентскогоКомпьютера", "HostName");
	Результат.Вставить("ИдентификаторКлиентскогоПриложения", "AppID");
	Результат.Вставить("МоментУстановкиСоединения", "ConnectedAt");
	Результат.Вставить("РежимСоединенияСИнформационнойБазой", "IBConnMode");
	Результат.Вставить("РежимСоединенияСБазойДанных", "dbConnMode");
	Результат.Вставить("БлокировкаСУБД", "blockedByDBMS");
	Результат.Вставить("Передано", "bytesAll");
	Результат.Вставить("ПереданоЗа5Минут", "bytesLast5Min");
	Результат.Вставить("СерверныхВызовов", "callsAll");
	Результат.Вставить("СерверныхВызововЗа5Минут", "callsLast5Min");
	Результат.Вставить("ПереданоСУБД", "dbmsBytesAll");
	Результат.Вставить("ПереданоСУБДЗа5Минут", "dbmsBytesLast5Min");
	Результат.Вставить("СоединениеСУБД", "dbProcInfo");
	Результат.Вставить("ВремяСУБД", "dbProcTook");
	Результат.Вставить("МоментЗахватаСоединенияСУБД", "dbProcTookAt");
	Результат.Вставить("ДлительностьСерверныхВызовов", "durationAll");
	Результат.Вставить("ДлительностьВызововСУБД", "durationAllDBMS");
	Результат.Вставить("ДлительностьТекущегоСерверногоВызова", "durationCurrent");
	Результат.Вставить("ДлительностьТекущегоВызоваСУБД", "durationCurrentDBMS");
	Результат.Вставить("ДлительностьСерверныхВызововЗа5Минут", "durationLast5Min");
	Результат.Вставить("ДлительностьВызововСУБДЗа5Минут", "durationLast5MinDBMS");
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствПрофиляБезопасности()
	
	Результат = Новый Структура();
	
	Результат.Вставить("Имя", "Name");
	Результат.Вставить("Описание", "Descr");
	Результат.Вставить("ПрофильБезопасногоРежима", "SafeModeProfile");
	Результат.Вставить("ПолныйДоступКПривилегированномуРежиму", "PrivilegedModeInSafeModeAllowed");
	
	Результат.Вставить("ПолныйДоступКФайловойСистеме", "FileSystemFullAccess");
	Результат.Вставить("ПолныйДоступКCOMОбъектам", "COMFullAccess");
	Результат.Вставить("ПолныйДоступКВнешнимКомпонентам", "AddInFullAccess");
	Результат.Вставить("ПолныйДоступКВнешнимМодулям", "UnSafeExternalModuleFullAccess");
	Результат.Вставить("ПолныйДоступКПриложениямОперационнойСистемы", "ExternalAppFullAccess");
	Результат.Вставить("ПолныйДоступКИнтернетРесурсам", "InternetFullAccess");
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствВиртуальногоКаталога()
	
	Результат = Новый Структура();
	
	Результат.Вставить("ЛогическийURL", "Alias");
	Результат.Вставить("ФизическийURL", "PhysicalPath");
	
	Результат.Вставить("Описание", "Descr");
	
	Результат.Вставить("ЧтениеДанных", "AllowedRead");
	Результат.Вставить("ЗаписьДанных", "AllowedWrite");
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствCOMКласса()
	
	Результат = Новый Структура();
	
	Результат.Вставить("Имя", "Name");
	Результат.Вставить("Описание", "Descr");
	
	Результат.Вставить("ФайлМоникер", "FileName");
	Результат.Вставить("CLSID", "ObjectUUID");
	Результат.Вставить("Компьютер", "ComputerName");
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствВнешнейКомпоненты()
	
	Результат = Новый Структура();
	Результат.Вставить("Имя", "Name");
	Результат.Вставить("Описание", "Descr");
	Результат.Вставить("ХэшСумма", "AddInHash"); // АПК:1036 для обратной совместимости
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствВнешнегоМодуля()
	
	Результат = Новый Структура();
	
	Результат.Вставить("Имя", "Name");
	Результат.Вставить("Описание", "Descr");
	Результат.Вставить("ХэшСумма", "ExternalModuleHash"); // АПК:1036 для обратной совместимости
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствПриложенияОС()
	
	Результат = Новый Структура();
	
	Результат.Вставить("Имя", "Name");
	Результат.Вставить("Описание", "Descr");
	
	Результат.Вставить("ШаблонСтрокиЗапуска", "CommandMask");
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствИнтернетРесурса()
	
	Результат = Новый Структура();
	
	Результат.Вставить("Имя", "Name");
	Результат.Вставить("Описание", "Descr");
	
	Результат.Вставить("Протокол", "Protocol");
	Результат.Вставить("Адрес", "Address");
	Результат.Вставить("Порт", "Port");
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

#КонецОбласти